/*
 * Copyright (C) 2021 xuexiangjys(xuexiangjys@163.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.example.ventilation.widget.MPChart.chart;

import android.content.Context;
import android.graphics.Color;

import com.example.ventilation.R;
import com.example.ventilation.code.common.model.GateInfoEntity;
import com.example.ventilation.code.common.model.WindInfoEntity;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.LimitLine;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.github.mikephil.charting.formatter.IndexAxisValueFormatter;
import com.github.mikephil.charting.formatter.PercentFormatter;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;

import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.List;


/**
 * LineCharUtils
 * @author TCL
 * @time 1/27/21 3:22 PM
 * https://javadoc.jitpack.io/com/github/PhilJay/MPAndroidChart/v3.1.0/javadoc/
 */
public class LineChartUtils {
    private  static LineChart mLineChart;
    private  static List<String> mxValue;
    /**
     * x,y轴的相关参数从方法最后两行进行调整
     * @param lineChart
     */
    public static void LineChartUtils(@NotNull LineChart lineChart){
        Description description = new Description();
        description.setText("");
        // 设置描述
        lineChart.setDescription(description);
        lineChart.setMaxVisibleValueCount(20);

        // 没有数据的时候，显示“暂无数据”
        lineChart.setNoDataText("暂无数据");

        // 不显示表格颜色
        lineChart.setDrawGridBackground(false);
        // 可以缩放
        lineChart.setScaleEnabled(true);//可放大;
        lineChart.setPinchZoom(true);//缩小;
        lineChart.setTouchEnabled(true);//可点击;
        // 不显示y轴右边的值
        lineChart.getAxisRight().setEnabled(false);


        // 设置透明度
        lineChart.setAlpha(0.8f);
        // 双击缩放
        lineChart.setDoubleTapToZoomEnabled(true);
        // 图例打开
        lineChart.getLegend().setEnabled(true);
        // 设置是否可以触摸
        lineChart.setTouchEnabled(false);
        // 是否可以拖拽
        lineChart.setDragEnabled(true);

        // 显示图例
        Legend legend = lineChart.getLegend();//图例;
        legend.setForm(Legend.LegendForm.LINE);//LegendForm枚举类,控制图样的形状与大小;
        legend.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
        legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
        legend.setOrientation(Legend.LegendOrientation.VERTICAL);
        legend.setTextColor(Color.WHITE);
        legend.setTextSize(12);
        legend.setDrawInside(true);

        // 向左偏移15dp，抵消y轴向右偏移的30dp
        lineChart.setExtraLeftOffset(-20);
        //chart.setScaleY(0.8f);

        // 设置X轴 相关参数从相关方法获取
        setXAxis(lineChart, 0, 0, 0,  "XTitleSuffix");
        // 设置Y轴相关 相关参数从相关方法获取
        setYAxis(lineChart, true, 0, 30, false);

        lineChart = lineChart;

    }

    /**
     * 2.设置坐标点
     * @param values      数据点 这里不传实体的数值再遍历是为了减少反复修改代码
     * @param color       线的颜色
     */
    public static synchronized void  addLineToLineChart(  LineChart lineChart,@NotNull List<Entry> values,
                                                  int color){//线的颜色


       LineDataSet lineDataSet = new LineDataSet(values, ""); //TODO label可以根据需求修改

        // 设置线的颜色
        lineDataSet.setColor(color);
        // 设置线的宽度
        lineDataSet.setLineWidth(1.2f);
        // 取消数据点上的数值显示
        lineDataSet.setDrawValues(false);

        // 取消数据点上的数值显示
        lineDataSet.setDrawValues(false);
        // 取消数据点上的原点
        lineDataSet.setDrawCircles(false);
        // lineChart.getLineData().getDataSets().add(lineDataSet);
        //设置为 弧线
        lineDataSet.setMode(LineDataSet.Mode.HORIZONTAL_BEZIER);//TODO 可以根据实际需求设置；


        LineData data = null;
        if (mLineChart.getData() == null) {
            List<ILineDataSet> dataSets = new ArrayList<>();
            dataSets.add(lineDataSet);
            data = new LineData(dataSets);
        }else {
            mLineChart.getData().getDataSets().add(lineDataSet);
            data = new LineData(mLineChart.getData().getDataSets());
        }

        // 为图表添加数据
        mLineChart.setData(data);
        // 重新更新显示
        mLineChart.invalidate();


    }

    /**
     * 3.设置x轴的lable
     * 给linechart设置x轴的值
     * @param xvalues 从外界获取
     */
    public static void formatXValues( LineChart lineChart,@NotNull List<String> xvalues) {
        mLineChart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(xvalues));
        mxValue = xvalues;

    }

    /**
     * 点击跳出marker，可以不设置
     * @param context
     */
    public static void setMarkerView( LineChart lineChart,Context context) {
        MyMarkerView mv = new MyMarkerView(context, R.layout.custom_marker_view,
                mLineChart,mxValue);
        mv.setChartView(mLineChart); // For bounds control
        mLineChart.setMarker(mv);

    }

    /**
     * 添加限制线
     * @param value              限制线的值
     * @param description        描述
     * @param lineColor          颜色
     * @param isEnableDashedLine 是否虚线
     */
    public static void addLimitLineToLineChart(float value,
                                               String description,
                                               int lineColor,
                                               boolean isEnableDashedLine){

        LimitLine limitLine = new LimitLine(value, description);
        limitLine.setLineColor(lineColor);
        limitLine.setLineWidth(1f);
        limitLine.setTextColor(lineColor);
        limitLine.setTextSize(10f);
        if (isEnableDashedLine) {
            limitLine.enableDashedLine(10f, 10f, 0f);
        }
        // .. and more styling options
        mLineChart.getAxisLeft().addLimitLine(limitLine);
    }



    /**
     * @param lineChart
     * @param isYStartAtZero     是否从0开始
     * @param yAxisMinValue      最小值
     * @param yAxisMaxValue      最大值
     * @param isPercentFormatter 是否百分比显示
     *
     * setEnabled, setTextColor, setTextSize, setTypeface, setXOffset, setYOffset
     */
    private static void setYAxis(@NotNull LineChart lineChart,
                                 boolean isYStartAtZero,
                                 float yAxisMinValue,
                                 float yAxisMaxValue,
                                 boolean isPercentFormatter){

        YAxis yAxis = lineChart.getAxisLeft(); //Y从左侧开始
        // Y轴刻度值颜色
        yAxis.setTextColor(Color.parseColor("#e0e0e0"));

        // 设置Y轴坐标是否从0开始
        yAxis.setStartAtZero(isYStartAtZero); //有些从中间开始的需要调整
        // 设置Y轴坐标最大为多少
        yAxis.setAxisMaximum(yAxisMaxValue);
        // 设置Y轴坐标最小为多少
        yAxis.setAxisMinimum(yAxisMinValue);

        // Y轴上的刻度竖线的颜色
        yAxis.setGridColor(Color.parseColor("#eeeeee"));

        // 设置Y轴上刻度竖线的宽度
        yAxis.setGridLineWidth(1.2f);

        //Y轴显示百分之几
        if (isPercentFormatter) {
            yAxis.setValueFormatter(new PercentFormatter());
        }

        // Y轴上的刻度的颜色
        yAxis.setTextColor(Color.parseColor("#9a9a9a"));

        yAxis.setDrawAxisLine(true);


        // 设置y轴数据的位置
        //yAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
        // 不从y轴发出横向直线
        yAxis.setDrawGridLines(false);
        yAxis.setTextSize(12);
        // 设置y轴数据偏移量
        yAxis.setXOffset(30);//y轴向右飘
        yAxis.setAxisMinimum(-0.1f);

    }


    /**
     * 设置X轴相关 具体设置还可以参考 https://javadoc.jitpack.io/com/github/PhilJay/MPAndroidChart/v3.1.0/javadoc/
     *
     * @param lineChart
     * @param xAxisStartPosition X轴起点
     * @param points             一个X轴点内部有几个数据点
     */
    private static void setXAxis(@NotNull LineChart lineChart,
                                 int xAxisStartPosition,
                                 int xAxisEndPosition,
                                 int points,
                                 String XTitleSuffix){
        XAxis xAxis = lineChart.getXAxis();

//        xAxis.setXOffset();
//        xAxis.setTypeface(); //设置字体
//        xAxis.setEnabled(); //是否展示

        // X轴上的刻度的颜色
        xAxis.setTextColor(Color.parseColor("#a0a0a0"));
        // xAxis.setTextSize();

        // X轴颜色
        xAxis.setAxisLineColor(Color.BLUE);
        // xAxis.setAxisLineWidth();

        // X轴上的刻度竖线的颜色
        xAxis.setGridColor(Color.parseColor("#eeeeee"));

        // 设置X轴上刻度竖线的宽度
        xAxis.setGridLineWidth(1.2f);

        // X轴位置
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);

        // 设置为true，则绘制该行旁边的轴线（axis-line）。
        xAxis.setDrawAxisLine(true);

        xAxis.setAvoidFirstLastClipping(false);

        xAxis.setLabelRotationAngle(30);//label倾斜的角度

        // 设置x轴数据偏移量
        xAxis.setYOffset(-12);//x轴向上飘

        xAxis.setLabelCount(points, true);//设置x轴显示个数;


    }

}
